import sensor, image, time, math
from pyb import UART, LED
import json
import ustruct

sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.VGA)  # High Res!
sensor.set_windowing((640, 200))  # V Res of 80 == less work (40 for 2X the speed).
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False)  # 必须关闭此功能，以防止图像冲洗…
sensor.set_auto_whitebal(False)  # 必须关闭此功能，以防止图像冲洗…
clock = time.clock()

uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1)  #8位数据位，无校验位，1位停止位

# 条形码检测可以在OpenMV Cam的OV7725相机模块的640x480分辨率下运行。
# 条码检测也将在RGB565模式下工作，但分辨率较低。 也就是说，
# 条形码检测需要更高的分辨率才能正常工作，因此应始终以640x480的灰度运行。

def barcode_name(code):
    if(code.type() == image.EAN2):
        return "EAN2"
    if(code.type() == image.EAN5):
        return "EAN5"
    if(code.type() == image.EAN8):
        return "EAN8"
    if(code.type() == image.UPCE):
        return "UPCE"
    if(code.type() == image.ISBN10):
        return "ISBN10"
    if(code.type() == image.UPCA):
        return "UPCA"
    if(code.type() == image.EAN13):
        return "EAN13"
    if(code.type() == image.ISBN13):
        return "ISBN13"
    if(code.type() == image.I25):
        return "I25"
    if(code.type() == image.DATABAR):
        return "DATABAR"
    if(code.type() == image.DATABAR_EXP):
        return "DATABAR_EXP"
    if(code.type() == image.CODABAR):
        return "CODABAR"
    if(code.type() == image.CODE39):
        return "CODE39"
    if(code.type() == image.PDF417):
        return "PDF417"
    if(code.type() == image.CODE93):
        return "CODE93"
    if(code.type() == image.CODE128):
        return "CODE128"

while(True):
    clock.tick()
    img = sensor.snapshot()
    codes = img.find_barcodes()
    for code in codes:
        # 获取条形码的矩形坐标
        rect = code.rect()
        # 计算条形码的中心坐标
        center_x = rect[0] + rect[2] // 2
        center_y = rect[1] + rect[3] // 2

        img.draw_rectangle(code.rect())
        img.draw_cross(center_x, center_y)  # 在图像上画出条形码中心位置

        # 构建帧头帧尾和条形码数据
        FH = bytearray([0xAA])  # 帧头
        uart.write(FH)
        uart.write(code.payload())  # 发送条形码内容
        uart.write(bytearray([center_x & 0xFF, (center_x >> 8) & 0xFF]))  # 发送X坐标（低字节，高字节）
        uart.write(bytearray([center_y & 0xFF, (center_y >> 8) & 0xFF]))  # 发送Y坐标（低字节，高字节）
        FH = bytearray([0xBB])  # 帧尾
        uart.write(FH)
        time.sleep_ms(100)
        print(code.payload)
        print(bytearray([center_x & 0xFF, (center_x >> 8) & 0xFF]))
        print(bytearray([center_y & 0xFF, (center_y >> 8) & 0xFF]))

    if not codes:
        print("FPS %f" % clock.fps())
